

/**
 * 接口 是事物的能力
 * 抽象类 是事物的本质
 * */
interface IMan {

    fun sex(){
        println("interface 20");
    };

    fun age();

    //接口中的抽象方法
    abstract fun ab();

}

//实现接口中的方法  或者 改成抽象类 abstract class
abstract class Man1:IMan{
    fun dat(){
        println("abstract 18");
    }
    //实现抽方法
    override fun ab() {
        println("abstract ab()");

    }
}

//写个类实现抽象方法
class shix : Man1(){
    //重写
    override fun age() {
        println(" override shix  18");
    }

}


//实现接口中的方法  或者 改成抽象类 abstract class
class Man2:IMan{
    override fun age() {
        println("重写接口IMan中的age方法");
    }

    override fun ab() {
        TODO("Not yet implemented")
    }

    //调用接中IMan的方法
    override fun sex() {
        super.sex()
    }
}

// 写一个抽象类
abstract class Human3{
    //抽象方法
    abstract fun eat();
}

/**
 * 接口 是事物的能力
 * 抽象类 是事物的本质
 * */
//Man8 类继承抽象类 重新抽象方法 抽象类要带括号 ()
//Man8 又继承接口 ，也要重新接口中的方法
class Man8:Human3(),IMan{
    //重写抽象类中的方法
    override fun eat() {
        println("Man8 重写抽象类中的方法eat()");
    }

    //重写接口中的方法
    override fun age() {
        println("Man8中的eat()");
    }

    //重写接口中的方法
    override fun ab() {
        TODO("Not yet implemented")
    }
}

class Man9:Human3(){
    override fun eat() {
        println("Man9中的eat()");
    }

}



fun main() {

//    interface 20
//    abstract ab()
//    override shix  18

    var man = shix();
    man.sex();  //调接口中的方法
    man.ab();
    man.age();
    println("------------");

    var ma2 = Man2();
    ma2.sex();
    ma2.age();

//    interface 20
//    重写接口IMan中的age方法

    var man3 = Man8();
    man3.eat();
    man3.age()

    var man4 = Man9();
    man4.eat();

    var house = listOf<Human3>(man3,man4);
    for (p in house){
        if (p is Man8){
            p.eat();
        }
    }



}